import 'package:get/get.dart';
import 'package:get/get_rx/get_rx.dart';

// class PageResult {
//   List list = [];
//   int pageNo = 1;
//   int pageSize = 10;
//   int pageCount = 0;
//   int totalPage = -1;

//   PageResult({list, pageNo, pageSize, totalPage}) {
//     list = list;
//     pageNo = pageNo;
//     pageSize = pageSize;
//     totalPage = totalPage;
//   }
// }

// 实现自定义类某个实现响应式：
// 1.需要响应式数据后面添加.obs
// 2.此时该数据已为响应式数据，在页面和正常的响应式数据调用方法一致： Obx(()=>组件)
// 3.Obx(()=>组件)组件范围最好只包围对应的响应式变量，触发更新只会更新这一块，提高性能
class PageLoad {
  List list = [].obs;
  int pageNo = 1;
  int pageSize = 10;
  int pageCount = 0;
  int totalPage = -1;
  late Future Function(Map<String, dynamic> params) requestApi;
  late Map<String, dynamic> params;
  RxBool isLoading = false.obs;
  RxBool loadComplete = false.obs;

  // const PageLoad()

  void loadData(
    Future Function(Map<String, dynamic> params) fn, {
    Map<String, dynamic> getParams = const {'pageNo': 1, 'pageSize': 5},
  }) {
    requestApi = fn;
    params = getParams;
    queryByPageAndParam();
  }

  // 将传入的分页数据和查询条件数据混合为一个对象，并查询数据
  void queryByPageAndParam() {
    if (isLoading.value || loadComplete.value) return;
    isLoading.value = true;

    Map<String, dynamic> arg = {
      'pageNo': pageNo,
      'pageSize': pageSize,
      ...params,
    };
    requestApi(arg).then((res) {
      setData(res);
    }).catchError((err) {
      print('请求错误$err');
    }).whenComplete(() {
      isLoading.value = false;
    });
  }

  setData(dynamic res) {
    MyData data = MyData.fromJson(res.data);

    pageNo = data.pageNo;
    pageSize = data.pageSize;
    pageCount = data.pageCount;
    totalPage = data.totalPage;
    // 更新list数据
    list.addAll(data.list);
    if (pageNo >= totalPage) {
      // 最后一页了
      loadComplete.value = true;
      return;
    }
  }

  void nextPage() {
    if (isLoading.value || loadComplete.value) return;
    pageNo = pageNo + 1;
    queryByPageAndParam();
  }
}

// 处理jsonMap数据的方法
class MyData {
  int pageNo;
  int pageSize;
  int pageCount;
  int totalPage;
  List<dynamic> list;

  MyData(
      {required this.pageNo,
      required this.pageSize,
      required this.pageCount,
      required this.list,
      required this.totalPage});

  factory MyData.fromJson(Map<String, dynamic> json) {
    return MyData(
        // Map数据值可以通过[]方式访问，这里通过[]访问数据，再赋值给class，就可以通过.访问
        // 注意：只是这个设置的属性可以.访问，里面的属性还是Map类型的话，还是需要[]访问，除非再写处理的方法，把使用Map数据赋值给class
        pageNo: json['pageNo'],
        pageSize: json['pageSize'],
        pageCount: json['pageCount'],
        list: json['list'],
        totalPage: json['totalPage']);
  }
}
